<?php
// 应用公共文件

// 支付方式
// 线上
use app\common\loader\ModelSystem;

const PAY_METHOD_ONLINE = 1;
// 线下
const PAY_METHOD_OFFLINE = 2;
// 银行扫码
const PAY_METHOD_BANK = 3;


// 增加用户金额
const MONEY_CHANGE_ADD = 1;
// 减少用户金额
const MONEY_CHANGE_SUB = 2;


// 商品码类型 虚码类型
const PRODUCT_CODE_TYPE_VIRTUAL = 1;
// 商品码类型 实码类型
const PRODUCT_CODE_TYPE_REAL = 2;


// 虚码特殊规则->导购
const VIRTUAL_PROMO_TYPE_SALE_MAN = 3;
// 虚码特殊规则->店铺
const VIRTUAL_PROMO_TYPE_SHOP = 2;
// 虚码特殊规则->店铺标签
const VIRTUAL_PROMO_TYPE_SHOP_TAG = 1;

// 余额充值手续费
const RECHARGE_RATE = 0.01;
//  默认最大红包金额
const MAX_RED_PACKET = 200;

#H5积分商品常量

// 自定义错误
const API_ERROR_CODE = 405;

// 导购
const USER_TYPE_SALESMAN = 1;
// 会员
const USER_TYPE_MEMBER = 2;

//积分订单状态

//等待处理
const ORDER_STATUS_PENDING = 0;
//等待发货
const ORDER_STATUS_WAIT_GOODS = 1;
//发货中
const ORDER_STATUS_SEND_GOODS = 2;
//已完成
const ORDER_STATUS_SUCCESS = 8;


/**
 * 获取时间函数
 * @param null $date
 * @return \yiqiniu\extend\library\Date
 */
function Dt($date = null)
{
    return new \yiqiniu\extend\library\Date($date);
}


/**
 *  生成密码
 * @param string $pwd 密码明文
 * @return string
 */
function password(string $pwd): string
{
    return md5(md5($pwd));
}


/**
 * md5 16位
 * @param string $str
 * @return string
 */
function md5_16(string $str): string
{
    return substr(md5($str), 8, 16);
}

/**
 * 判断给定的内容是否手机号码
 * @param string $str
 * @return bool
 */
function isMobile(string $str): bool
{
    // 不是正则表达式则两端补上/
    $rule = '/^1[3-9]\d{9}$/';
    return preg_match($rule, (string)$str);
}

/**
 * 根据配置值,显示其标题
 * @param string $confItem
 * @param string $value
 * @param string $default
 * @return mixed|string
 */
function showConfigTitle(string $confItem, string $value, string $default = ''): string
{
    $confList = config($confItem);
    if ($value === '') {
        return $confList;
    }
    return $confList[$value] ?? $default;
}

/**
 * 生成唯一的单号
 * @param string $typeval 自定义值, 插入到中间位,默认为空
 * @param string $prefix 单号前缀 ,默认为空
 * @return string 返回生成的单号
 */
function make_unique_no(string $typeval = '', string $prefix = ''): string
{
    return sprintf("%s%s%s%s", $prefix, date('YmdHis'), $typeval, \think\helper\Str::random(7, 1));
}

/**
 * 获取请求的地址
 * @return string
 */
function domain($name = ''): string
{
    $api_prefix = env('api_prefix', 'api');
    if (!empty($api_prefix)) {
        $api_prefix = '/' . $api_prefix;
    }

    if (empty($name)) {
        $name = app()->http->getName();
    }
    if (!empty($name)) {
        $api_prefix .= '/' . $name;
    }
    return request()->domain() . $api_prefix;
}

/**
 * 导购入口地址
 * @param string $mer_id
 * @param string $state
 * @return string
 */
function merchant_entry(string $mer_id): string
{
    return domain('home') . '/entry?key=' . base64_en($mer_id);
}

function base64_en(string $string): string
{
    return \yiqiniu\extend\facade\Extend::Str()->base64_en($string);
}

function base64_de(string $string): string
{
    return \yiqiniu\extend\facade\Extend::Str()->base64_de($string);
}


/**
 *  保存上传的日志
 * @param array $urls 文件URL
 * @return mixed
 */
function saveUploadLog(array $urls)
{
    try {
        return ModelSystem::SystemUploads()->saveLog($urls);
    } catch (Exception $e) {
        return false;
    }
}

/**
 * 更新上传的状态
 * @param string|array $url 文件名
 * @param int $id 关联ID
 * @return mixed
 */
function updateUploadStatus($url, int $id)
{
    try {
        $url = is_array($url) ? $url : [$url];
        return ModelSystem::SystemUploads()->updateLog($url, $id);
    } catch (Exception $e) {
        return false;
    }
}

/**
 * 删除上传的文件
 * @param string|array $url
 * @return mixed
 */
function deleteUploadLog($url)
{
    try {
        $url = is_array($url) ? $url : [$url];
        return ModelSystem::SystemUploads()->deleteLog($url);
    } catch (Exception $e) {
        return false;
    }
}

/**
 * 计算两点之间的距离getDistance
 * @param $lng1 |经度1
 * @param $lat1 |纬度1
 * @param $lng2 |经度2
 * @param $lat2 |纬度2
 * @param int $unit m，km
 * @param int $decimal 位数
 * @return float
 */
function getDistance($fP1Lat, $fP1Lon, $fP2Lat, $fP2Lon)
{
    if (empty($fP1Lat) || empty($fP1Lon) || empty($fP2Lat) || empty($fP2Lon)){
       return  false;
    }
    $fEARTH_RADIUS = 6378137;
    //角度换算成弧度
    $fRadLon1 = deg2rad((float)$fP1Lon);
    $fRadLon2 = deg2rad((float)$fP2Lon);
    $fRadLat1 = deg2rad((float)$fP1Lat);
    $fRadLat2 = deg2rad((float)$fP2Lat);
    //计算经纬度的差值
    $fD1 = abs($fRadLat1 - $fRadLat2);
    $fD2 = abs($fRadLon1 - $fRadLon2);
    //距离计算
    $fP = (sin($fD1 / 2) ** 2) +
        cos($fRadLat1) * cos($fRadLat2) * (sin($fD2 / 2) ** 2);
    return intval($fEARTH_RADIUS * 2 * asin(sqrt($fP)) + 0.5);
}

/**
 * 根据地址获取经纬度
 * @param string $address 地址
 * @param string $city  城市名
 * @return array
 */
function getLatLng($address='',$city='')
{
    $result = array();
    $ak = 'j6d2zTfenprZIo4mWigRUfUr4oxnXCf1'; //您的百度地图ak，可以去百度开发者中心去免费申请
    $url ="http://api.map.baidu.com/geocoding/v3/?output=json&output=json&address=".$address."&city=".$city."&ak=".$ak;
    $data = file_get_contents($url);
    $data = str_replace('renderOption&&renderOption(', '', $data);
    $data = str_replace(')', '', $data);
    $data = json_decode($data, true, 512, JSON_THROW_ON_ERROR);
    if (!empty($data) && (int)$data['status'] === 0) {
        $result['lat'] = $data['result']['location']['lat'];
        $result['lng'] = $data['result']['location']['lng'];
        return $result;//返回经纬度结果
    }

    return null;

}

/**
 *
 */
function get_app(string $app):string
{
   return is_mobile_app() ?  '3' : $app;
}

/**
 * 判断是否手机浏览
 * @return bool
 */
function is_mobile_app()
{
    // 如果有HTTP_X_WAP_PROFILE则一定是移动设备
    if (isset ($_SERVER['HTTP_X_WAP_PROFILE'])) {
        return TRUE;
    }
    // 如果via信息含有wap则一定是移动设备,部分服务商会屏蔽该信息
    if (isset ($_SERVER['HTTP_VIA'])) {
        return (bool)stristr($_SERVER['HTTP_VIA'], "wap");// 找不到为flase,否则为TRUE
    }
    // 判断手机发送的客户端标志,兼容性有待提高
    if (isset ($_SERVER['HTTP_USER_AGENT'])) {
        $clientkeywords = array(
            'mobile',
            'nokia',
            'sony',
            'ericsson',
            'mot',
            'samsung',
            'htc',
            'sgh',
            'lg',
            'sharp',
            'sie-',
            'philips',
            'panasonic',
            'alcatel',
            'lenovo',
            'iphone',
            'ipad',
            'ipod',
            'blackberry',
            'meizu',
            'android',
            'netfront',
            'symbian',
            'ucweb',
            'windowsce',
            'palm',
            'operamini',
            'operamobi',
            'openwave',
            'nexusone',
            'cldc',
            'midp',
            'wap',
            'huawei',
            'Coolpad',
            'EVA',
            'ZTE',
            'OPPO',
            'Redmi',
            'vivo',
        );
        // 从HTTP_USER_AGENT中查找手机浏览器的关键字
        if (preg_match("/(" . implode('|', $clientkeywords) . ")/i", strtolower($_SERVER['HTTP_USER_AGENT']))) {
            return TRUE;
        }
    }
    if (isset ($_SERVER['HTTP_ACCEPT'])) { // 协议法，因为有可能不准确，放到最后判断
        // 如果只支持wml并且不支持html那一定是移动设备
        // 如果支持wml和html但是wml在html之前则是移动设备
        if ((strpos($_SERVER['HTTP_ACCEPT'], 'vnd.wap.wml') !== FALSE) && (strpos($_SERVER['HTTP_ACCEPT'], 'text/html') === FALSE || (strpos($_SERVER['HTTP_ACCEPT'], 'vnd.wap.wml') < strpos($_SERVER['HTTP_ACCEPT'], 'text/html')))) {
            return TRUE;
        }
    }
    return FALSE;
}

/**
 * 获取版本号
 * @param string $name
 * @return mixed
 */
function get_version($name = 'web'){
    return \yiqiniu\extend\facade\Version::get(app()->http->getName());
}
